// Copyright (C) 2019 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-asyncfromsynciteratorcontinuation
description: >
  Reject promise when PromiseResolve in AsyncFromSyncIteratorContinuation throws.
info: |
  25.1.4.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability )
    ...
    5. Let valueWrapper be PromiseResolve(%Promise%, « value »).
    6. IfAbruptRejectPromise(valueWrapper, promiseCapability).
    ...

includes: [compareArray.js]
flags: [async]
features: [async-iteration]
---*/

function Test() {
    var expected = [
      "start",

      // `valueWrapper` promise rejected.
      "tick 1",

      // `Await(nextResult)` in 13.7.5.13 done.
      "tick 2",

      // catch handler executed.
      "catch",
    ];

    var actual = [];

    async function f() {
      var p = Promise.resolve(0);
      Object.defineProperty(p, "constructor", {
        get() {
          throw new Error();
        }
      });
      actual.push("start");
      for await (var x of [p]);
      actual.push("never reached");
    }

    Promise.resolve(0)
      .then(() => actual.push("tick 1"))
      .then(() => actual.push("tick 2"))
      .then(() => {
        assert.compareArray(actual, expected);
    }).then($DONE, $DONE);

    f().catch(() => actual.push("catch"));
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
